package org.ming.ticketSellingSystem.framework.starter.bases.init;

import lombok.RequiredArgsConstructor;
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * TODO:应用初始化后置处理器,防止Spring事件多次执行
 * ApplicationListener 用于监听应用中的事件,实现事件驱动的编程模型
 */
@RequiredArgsConstructor
public class ApplicationContentPostProcessor implements ApplicationListener<ApplicationEvent> {

    private final ApplicationContext applicationContext;
    /**
     * 执行标识
     */
    private final AtomicBoolean executeOnlyOnce = new AtomicBoolean(false);

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if(!executeOnlyOnce.compareAndSet(false,true))
            return;
        /**
         *  Spring 中用于发布事件的方法,可以将自定义事件或 Spring 事件发布到应用程序的上下文中,所有注册的监听器会接收到该事件并做出响应
         *  这是实现松耦合组件之间通信的有效方式
         */
        applicationContext.publishEvent(new ApplicationInitializingEvent(this));
    }
}
